package bsk_dac.actions;

import bsk_dac.DACPanel;
import bsk_dac.MainDACFrame;
import bsk_dac.PrivilegesPanel;
import bsk_dac.UserPanel;
import bsk_dac.accesscontrol.TableAccess;
import bsk_dac.database.DatabaseFacade;
import bsk_dac.database.DatabaseUser;
import bsk_dac.tables.TablesManager;
import bsk_dac.users.IUsersManager;
import bsk_dac.users.User;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
import javax.swing.JOptionPane;
import javax.swing.JToggleButton;

/**
 * Klasa która nasłuchuje na wciśnięcia toggle button-ów.
 * Jej głównym zadaniem jest kontrolowanie czy w macierzy uprawnień jest wybrany tylko 0, albo 1 użytkownik.
 * Jeśli ktoś będzie chcial wybrać więcej niż 1 to wyskoczy mu messagebox z informacją.
 */
public class SelectingUser implements ActionListener {

    DACPanel dacPanel;
    ArrayList<UserPanel> usersPanel;
    IUsersManager usersManager;

    public SelectingUser(ArrayList<UserPanel> usersPanel, DACPanel dacPanel) {
        this.usersPanel = usersPanel;
        this.dacPanel = dacPanel;
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JToggleButton) {
            if (MainDACFrame.adminMode == true) {
                adminAction(e);
            } else {
                userAction(e);
            }
        }
    }

    private void userAction(ActionEvent e) {
        usersManager = MainDACFrame.getUsersManager();
        JToggleButton tButton = (JToggleButton) e.getSource();
        if (!canToggleButton(tButton)) {
            tButton.setSelected(false);
            showMessageBox("Bład wyboru użytkownika", "Nie można wybrać tego użytkownika");
        } else {
            if (tButton.isSelected()) {
                User selectedUser = ((UserPanel) tButton.getParent()).getUser();
                if (selectedUser.getUserName().equals(DatabaseUser.userName)) {
                    usersManager.setSelectedUser(selectedUser);
                    dacPanel.markUserRow(selectedUser, new Color(89, 187, 239));
                    dacPanel.givePrivileges();
                } else {
                    showMessageBox("Bład wyboru użytkownika", "Wybraleś złego użytkownika");
                    tButton.setSelected(false);
                    usersManager.setSelectedUser(null);
                }
            } else {
                dacPanel.markUserRow(usersManager.getSelectedUser(), Color.WHITE);
                setDisabledStatusForAllCheckbox();
                usersManager.setSelectedUser(null);
            }
            dacPanel.refreshPanelsAccess();
            dacPanel.repaint();
        }
    }

    private void adminAction(ActionEvent e) {
        usersManager = MainDACFrame.getUsersManager();
        JToggleButton tButton = (JToggleButton) e.getSource();
        User selectedUser = ((UserPanel) tButton.getParent()).getUser();
        try {
            if (tButton.isSelected()) {
                DatabaseFacade.setUserGivePriv(selectedUser.getUserName(), true);
                System.out.println(new Date() + " Admin: Danie prawa do przejmowania uprawnień użytkownikowi '"+selectedUser.getUserName()+"'");
            } else {
                DatabaseFacade.setUserGivePriv(selectedUser.getUserName(), false);
                System.out.println(new Date() + " Admin: Zabranie prawa do przejmowania uprawnień użytkownikowi'"+selectedUser.getUserName()+"'");
            }
        } catch (SQLException se) {
            se.printStackTrace();
        }
    }

    private boolean canToggleButton(JToggleButton tButton) {
        for (UserPanel userPanel : usersPanel) {
            if (userPanel.isButtonSelected() && !userPanel.containToggleButton(tButton)) {
                return false;
            }
        }
        return true;
    }

    private void showMessageBox(String title, String content) {
        JOptionPane.showMessageDialog(null, content, title, JOptionPane.ERROR_MESSAGE);
    }

    private void setDisabledStatusForAllCheckbox() {
        Map<User, ArrayList<PrivilegesPanel>> usersRow = dacPanel.getUsersRow();

        TablesManager tableManager = TablesManager.getTableManager();
        ArrayList<String> tablesNames = tableManager.getAvaiableTables();

        for (User user : usersRow.keySet()) {
            ArrayList<PrivilegesPanel> privilegesPanels = usersRow.get(user);
            for (int i = 0; i < tablesNames.size(); i++) {
                TableAccess allDisabledAccess = TableAccess.getAllDisabledAccess();
                PrivilegesPanel panel = privilegesPanels.get(i);
                panel.setCheckboxState(allDisabledAccess, true, true, false);
            }
        }

    }
}
